package com.bsj.power.common.config.auth;

import cn.dev33.satoken.interceptor.SaInterceptor;
import cn.dev33.satoken.router.SaRouter;
import cn.dev33.satoken.stp.StpUtil;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;
import org.springframework.core.annotation.Order;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

/**
 * @author yinhao
 * @version 1.0
 * @description 登录鉴权
 * @date 2024/4/18
 */

@Profile({"power-master-system", "power-module-job", "power-module-video", "power-module-pls"})
@Configuration
@Order(-1)
public class AuthLoginConfigure implements WebMvcConfigurer {

    private static final String[] pathStr = new String[]
            {"/system/user/doLogin", "/system/user/doLogout",
                    "*/actuator/prometheus", "/v1/open/api/*"};

    /**
     * 跨域配置
     *
     * @param registry
     */
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**").allowedOriginPatterns("*")
                .allowedMethods("GET", "HEAD", "POST", "PUT", "DELETE", "OPTIONS")
                .allowCredentials(true).maxAge(3600);
    }

    /**
     * 在Controller中创建一个接口，默认不需要登录也不需要任何权限都可以访问的，只有加了上述注解才会校验
     * 注册Sa-Token的注解拦截器，打开注解式鉴权功能
     * 注解既可以加在接口方法上，也可加在Controller类上：
     * 1.@SaCheckLogin: 登录认证 —— 只有登录之后才能进入该方法（常用）
     * 2.@SaCheckRole("admin"): 角色认证 —— 必须具有指定角色标识才能进入该方法（常用）
     * 3.@SaCheckPermission("user:add"): 权限认证 —— 必须具有指定权限才能进入该方法（常用）
     * 4.@SaCheckSafe: 二级认证校验 —— 必须二级认证之后才能进入该方法
     *
     * @param registry
     */
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new SaInterceptor(handler -> {
            SaRouter
                    //拦截的地址范围，这里代表拦截全部
                    .match("/**")
                    //在全部拦截的范围中过滤以下请求
                    .notMatch(pathStr)
                    //要执行的校验动作，以下为登录校验
                    .check(r -> StpUtil.checkLogin());
        })).addPathPatterns("/**");
    }
}
